home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / dns / rdataset.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  7KB  |  217 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. import random
  5. import StringIO
  6. import struct
  7. import dns.exception as dns
  8. import dns.rdatatype as dns
  9. import dns.rdataclass as dns
  10. import dns.rdata as dns
  11. import dns.set as dns
  12. SimpleSet = dns.set.Set
  13.  
  14. class DifferingCovers(dns.exception.DNSException):
  15.     pass
  16.  
  17.  
  18. class IncompatibleTypes(dns.exception.DNSException):
  19.     pass
  20.  
  21.  
  22. class Rdataset(dns.set.Set):
  23.     __slots__ = [
  24.         'rdclass',
  25.         'rdtype',
  26.         'covers',
  27.         'ttl']
  28.     
  29.     def __init__(self, rdclass, rdtype, covers = dns.rdatatype.NONE):
  30.         super(Rdataset, self).__init__()
  31.         self.rdclass = rdclass
  32.         self.rdtype = rdtype
  33.         self.covers = covers
  34.         self.ttl = 0
  35.  
  36.     
  37.     def _clone(self):
  38.         obj = super(Rdataset, self)._clone()
  39.         obj.rdclass = self.rdclass
  40.         obj.rdtype = self.rdtype
  41.         obj.covers = self.covers
  42.         obj.ttl = self.ttl
  43.         return obj
  44.  
  45.     
  46.     def update_ttl(self, ttl):
  47.         if len(self) == 0:
  48.             self.ttl = ttl
  49.         elif ttl < self.ttl:
  50.             self.ttl = ttl
  51.         
  52.  
  53.     
  54.     def add(self, rd, ttl = None):
  55.         if self.rdclass != rd.rdclass or self.rdtype != rd.rdtype:
  56.             raise IncompatibleTypes
  57.         
  58.         if ttl is not None:
  59.             self.update_ttl(ttl)
  60.         
  61.         if self.rdtype == dns.rdatatype.RRSIG or self.rdtype == dns.rdatatype.SIG:
  62.             covers = rd.covers()
  63.             if len(self) == 0 and self.covers == dns.rdatatype.NONE:
  64.                 self.covers = covers
  65.             elif self.covers != covers:
  66.                 raise DifferingCovers
  67.             
  68.         
  69.         if dns.rdatatype.is_singleton(rd.rdtype) and len(self) > 0:
  70.             self.clear()
  71.         
  72.         super(Rdataset, self).add(rd)
  73.  
  74.     
  75.     def union_update(self, other):
  76.         self.update_ttl(other.ttl)
  77.         super(Rdataset, self).union_update(other)
  78.  
  79.     
  80.     def intersection_update(self, other):
  81.         self.update_ttl(other.ttl)
  82.         super(Rdataset, self).intersection_update(other)
  83.  
  84.     
  85.     def update(self, other):
  86.         self.update_ttl(other.ttl)
  87.         super(Rdataset, self).update(other)
  88.  
  89.     
  90.     def __repr__(self):
  91.         if self.covers == 0:
  92.             ctext = ''
  93.         else:
  94.             ctext = '(' + dns.rdatatype.to_text(self.covers) + ')'
  95.         return '<DNS ' + dns.rdataclass.to_text(self.rdclass) + ' ' + dns.rdatatype.to_text(self.rdtype) + ctext + ' rdataset>'
  96.  
  97.     
  98.     def __str__(self):
  99.         return self.to_text()
  100.  
  101.     
  102.     def __eq__(self, other):
  103.         if not isinstance(other, Rdataset):
  104.             return False
  105.         
  106.         if self.rdclass != other.rdclass and self.rdtype != other.rdtype or self.covers != other.covers:
  107.             return False
  108.         
  109.         return super(Rdataset, self).__eq__(other)
  110.  
  111.     
  112.     def __ne__(self, other):
  113.         return not self.__eq__(other)
  114.  
  115.     
  116.     def to_text(self, name = None, origin = None, relativize = True, override_rdclass = None, **kw):
  117.         if name is not None:
  118.             name = name.choose_relativity(origin, relativize)
  119.             ntext = str(name)
  120.             pad = ' '
  121.         else:
  122.             ntext = ''
  123.             pad = ''
  124.         s = StringIO.StringIO()
  125.         if override_rdclass is not None:
  126.             rdclass = override_rdclass
  127.         else:
  128.             rdclass = self.rdclass
  129.         if len(self) == 0:
  130.             print >>s, '%s%s%s %s' % (ntext, pad, dns.rdataclass.to_text(rdclass), dns.rdatatype.to_text(self.rdtype))
  131.         else:
  132.             for rd in self:
  133.                 print >>s, '%s%s%d %s %s %s' % (ntext, pad, self.ttl, dns.rdataclass.to_text(rdclass), dns.rdatatype.to_text(self.rdtype), rd.to_text(origin = origin, relativize = relativize, **kw))
  134.             
  135.         return s.getvalue()[:-1]
  136.  
  137.     
  138.     def to_wire(self, name, file, compress = None, origin = None, override_rdclass = None, want_shuffle = True):
  139.         if override_rdclass is not None:
  140.             rdclass = override_rdclass
  141.             want_shuffle = False
  142.         else:
  143.             rdclass = self.rdclass
  144.         file.seek(0, 2)
  145.         if len(self) == 0:
  146.             name.to_wire(file, compress, origin)
  147.             stuff = struct.pack('!HHIH', self.rdtype, rdclass, 0, 0)
  148.             file.write(stuff)
  149.             return 1
  150.         elif want_shuffle:
  151.             l = list(self)
  152.             random.shuffle(l)
  153.         else:
  154.             l = self
  155.         for rd in l:
  156.             name.to_wire(file, compress, origin)
  157.             stuff = struct.pack('!HHIH', self.rdtype, rdclass, self.ttl, 0)
  158.             file.write(stuff)
  159.             start = file.tell()
  160.             rd.to_wire(file, compress, origin)
  161.             end = file.tell()
  162.             file.seek(start - 2)
  163.             stuff = struct.pack('!H', end - start)
  164.             file.write(stuff)
  165.             file.seek(0, 2)
  166.         
  167.         return len(self)
  168.  
  169.     
  170.     def match(self, rdclass, rdtype, covers):
  171.         if self.rdclass == rdclass and self.rdtype == rdtype and self.covers == covers:
  172.             return True
  173.         
  174.         return False
  175.  
  176.  
  177.  
  178. def from_text_list(rdclass, rdtype, ttl, text_rdatas):
  179.     if isinstance(rdclass, str):
  180.         rdclass = dns.rdataclass.from_text(rdclass)
  181.     
  182.     if isinstance(rdtype, str):
  183.         rdtype = dns.rdatatype.from_text(rdtype)
  184.     
  185.     r = Rdataset(rdclass, rdtype)
  186.     r.update_ttl(ttl)
  187.     for t in text_rdatas:
  188.         rd = dns.rdata.from_text(r.rdclass, r.rdtype, t)
  189.         r.add(rd)
  190.     
  191.     return r
  192.  
  193.  
  194. def from_text(rdclass, rdtype, ttl, *text_rdatas):
  195.     return from_text_list(rdclass, rdtype, ttl, text_rdatas)
  196.  
  197.  
  198. def from_rdata_list(ttl, rdatas):
  199.     if len(rdatas) == 0:
  200.         raise ValueError, 'rdata list must not be empty'
  201.     
  202.     r = None
  203.     for rd in rdatas:
  204.         if r is None:
  205.             r = Rdataset(rd.rdclass, rd.rdtype)
  206.             r.update_ttl(ttl)
  207.             first_time = False
  208.         
  209.         r.add(rd)
  210.     
  211.     return r
  212.  
  213.  
  214. def from_rdata(ttl, *rdatas):
  215.     return from_rdata_list(ttl, rdatas)
  216.  
  217.